// 设计忘记密码跳转来的密码修改页面

// 关闭VSCode报错
// ignore_for_file: camel_case_types, non_constant_identifier_names, use_build_context_synchronously, must_be_immutable, unnecessary_overrides

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:project_award_statistics/utils/load_user_info_from_db/load_user_info.dart';
import 'package:project_award_statistics/utils/load_user_info_from_db/user_model.dart';
import 'package:project_award_statistics/utils/mobile_material_design/dialogs/change_passwd/change_passwd_err_empty.dart';
import 'package:project_award_statistics/utils/mobile_material_design/dialogs/change_passwd/change_passwd_err_no_exist_user.dart';
import 'package:project_award_statistics/utils/mobile_material_design/dialogs/change_passwd/change_passwd_err_same_passwd.dart';
import 'package:project_award_statistics/utils/mobile_material_design/dialogs/change_passwd/change_passwd_success.dart';
import 'package:project_award_statistics/utils/mobile_material_design/my_button.dart';

class ChangePasswdPage_Mobile extends StatefulWidget {
  String stu_name;      // 获取必需的用户在登录界面输入的姓名,方便在此页面自动填写对应姓名
  ChangePasswdPage_Mobile({
    super.key,
    required this.stu_name,
  });

  @override
  State<ChangePasswdPage_Mobile> createState() => _ChangePasswdPage_MobileState();
}

class _ChangePasswdPage_MobileState extends State<ChangePasswdPage_Mobile> with TickerProviderStateMixin {
  // 初始化生命animation_timer控制整个页面动画进行的对象
  late Timer animation_timer;
  // 初始化淡入淡出动画总线控制器1
  bool widget1_isVisible = false; // 设置淡入效果控件最开始不可见
  bool widget2_isVisible = false; // 设置淡入效果控件最开始不可见
  // 初始化动画总线控制器2
  late AnimationController _animationController_widget3;

  // 初始化文本控制器用于存储用户输入的姓名与密码
  TextEditingController textcontroller_user_name = TextEditingController();
  TextEditingController textcontroller_password = TextEditingController();

  // 当用户准备修改密码时执行的函数
  void change_passwd (String user,String new_passwd) async
    {
      // 先获取所有用户信息
      List<user_info_model> cur_user_info = await DBProvider_UserInfo().get_user_list();
      // 先检查用户是否填写了所有信息,如果没有就返回报错
      if (user.isEmpty || new_passwd.isEmpty)
        {
          showDialog(
            context: context, 
            builder: (context){
              return DialogChangePasswdErr_Empty_Mobile();
            },
          );
        }
      else
        {
          int i = 0;
          int input_user_point = 0; // input_user_point用于下方循环找到
          bool user_is_exist = false; // user_is_exist用于下方是否在用户数据表中找到对应用户
          for (i=0;i<cur_user_info.length;i++)
            {
              // 如果修改密码的目标对应用户存在
              if (user==cur_user_info[i].stu_name)
                {
                  input_user_point=i;   // 修改修改密码的目标用户下标
                  user_is_exist=true;
                  break;  // 跳出循环,减少不必要循环以节省时间提升效率
                }
            }

          // 如果修改密码的目标用户存在/不存在
          if (user_is_exist)
            {
              // 如果用户输入的新密码与之前的一样
              if (new_passwd==cur_user_info[input_user_point].password)
                {
                  showDialog(
                    context: context, 
                    builder: (context){
                      return DialogChangePasswdErr_SamePasswd_Mobile();
                    },
                  );
                }
              // 如果都符合修改密码的条件就进行修改
              else
                {
                  await DBProvider_UserInfo().change_passwd(user,new_passwd);
                  showDialog(
                    context: context, 
                    builder: (context){
                      return DialogChangePasswdSuccess_Mobile();
                    },
                  );
                }
            } 
          else     // 如果发现用户填写的用户并不存在
            {
              showDialog(
                context: context, 
                builder: (context){
                  return DialogChangePasswdErr_NoExist_Mobile();
                },
              );
            }
        }
    }

  @override
  void initState() // 覆写父类初始化(构造)函数
  {
    super.initState();
    // 给输入姓名的位置先赋初值 (即自动填写用户登录界面输入的姓名)
    textcontroller_user_name.text=widget.stu_name;
    // 初始化所有动画总线
    _animationController_widget3 = AnimationController(
      duration: Duration(milliseconds: 1300), // 设置动画持续时间
      vsync: this,
    );
    if (mounted)   // 如果小部件仍处于挂载状态 (即页面未被销毁)
      {
        animation_timer=Timer(Duration(milliseconds: 650), () {
          if (mounted)    // 在每个小部件设置状态都先检查它是否被销毁,防止动画未播放完就退出引发一系列问题
            {
              setState(() {
                widget1_isVisible = !widget1_isVisible; // 设置淡入总线1可见
              });
            }
          // 启动淡入总线1后同时启动总线2和动画总线3
          Timer(Duration(milliseconds: 1500), () {
            if (mounted)     // 在每个小部件设置状态都先检查它是否被销毁,如果被销毁就不再继续进行构建
              {
                setState(() {
                  widget2_isVisible = !widget2_isVisible; // 设置淡入总线2可见
                });
              }
            Timer(Duration(milliseconds: 0), () {
              if (mounted)     // 在每个小部件(动画)设置状态都先检查它是否被销毁,如果被销毁就不再继续进行构建
                {
                  _animationController_widget3.forward(); // 启动动画总线3
                }
            });  
          });  
        }); 
      } 
  }
  void animation_dispose ()    // 用于释放当前页面的动画
    {
      _animationController_widget3.stop();
      _animationController_widget3.dispose();
    }
  @override
  void dispose ()   // 覆写父类析构函数
    {
      super.dispose();
      animation_timer.cancel();
      animation_dispose();    // 在页面被销毁前进行停止并释放动画对象操作
    } 

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: false, // 防止安卓设备输入时导致程序显示面积被压缩
      appBar: AppBar(
        // 设置页面顶栏名称
        backgroundColor: Colors.transparent,
        elevation: 0,
        foregroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text(
          // 设置标题栏文字
          "修改密码页面",
        ),
      ),
      body: Padding(
        padding: EdgeInsets.only(left: 15, right: 15, top: 20, bottom: 20),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Image.asset(
                  // 显示校徽
                  "lib/images/northwest_minzu_university_icon.png",
                  width: 100,
                  height: 100,
                ),  
                const SizedBox(width: 35),
                Column(
                  children: [
                    Text(
                      "西北民族大学",
                      style: TextStyle(
                        fontSize: 28,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                    const SizedBox(height: 14),
                    Text("电子设计工作室", style: TextStyle(fontSize: 24)),
                  ],
                ),   
              ],
            ),    
            Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                const SizedBox(height: 40),
                AnimatedOpacity(
                  opacity: widget1_isVisible ? 1.0 : 0.0,
                  duration: Duration(milliseconds: 1200),
                  child: Text(
                    "忘记密码了?",
                    style: TextStyle(fontSize: 35, fontWeight: FontWeight.bold),
                  ),
                ),
                const SizedBox(height: 10),
                AnimatedOpacity(
                  opacity: widget2_isVisible ? 1.0 : 0.0,
                  duration: Duration(milliseconds: 1200),
                  child: Text(
                    "那就在下方输入栏填入你的新密码吧 ~",
                    style: TextStyle(fontSize: 20),
                  ),
                ),
              ],
            ),
            const SizedBox(height: 45),
            // 设置输入框动画及本体
            SlideTransition(
              position: Tween<Offset>(
                begin: Offset(-3.0, 0.0),
                end: Offset.zero,
              ).animate(
                CurvedAnimation(
                  parent: _animationController_widget3,
                  curve: Curves.easeInOut,
                ),
              ),
              child: Column(
                // 该子行分别设置输入姓名与密码的文本输入框
                children: [
                  TextField(
                    controller: textcontroller_user_name,
                    decoration: InputDecoration(
                      border: OutlineInputBorder(),
                      labelText: "请在这里输入您的姓名",
                      labelStyle: TextStyle(
                        // 设置提示文本为黑色
                        color: Colors.black,
                      ),
                    ),
                  ),
                  const SizedBox(height: 30),
                  TextField(
                    controller: textcontroller_password,
                    obscureText: true,   // 由于输入的是密码,故不显示文本内容
                    decoration: InputDecoration(
                      border: OutlineInputBorder(),
                      labelText: "在这里输入您想设置的新密码",
                      labelStyle: TextStyle(
                        // 设置提示文本为黑色
                        color: Colors.black,
                      ),
                    ),
                  ),
                  const SizedBox(height: 80),
                  Center(
                    child: SizedBox(
                      height: 40,
                      width: 150,
                      child: MyButton(
                        text: "我修改好了", 
                        onPressed: (){      // 执行尝试进行修改密码的操作
                          change_passwd(textcontroller_user_name.text,textcontroller_password.text);
                        },
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}
